package com.momo.apachedoris.entity;

import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.Map;

/**
 * @Author: Jie Li
 * @Date 2022年12月14日 22:23
 * @Description: TODO
 * @Version: 1.0
 * <p>Copyright: Copyright (c) 2022</p >
 **/
@Data
@Slf4j
public class SqlVo {

    private List<SelectVo> tables;

    private List<JoinTableVo> joinTable;

    public static void main(String[] args) {
        List<SelectVo> tables = Lists.newArrayList();

        SelectVo table1 = new SelectVo();
        table1.setAlias(" table1");
        table1.setTable(" ra_acd_file");
        List<ExpressionVo> expression1 = Lists.newArrayList();
        expression1.add(ExpressionVo.builder().field("field1").build());
        table1.setExpression(expression1);
        tables.add(table1);

        SelectVo table2 = new SelectVo();
        table2.setAlias(" table2");
        table2.setTable(" ra_acd_file_human");
        List<ExpressionVo> expression2 = Lists.newArrayList();
        expression2.add(ExpressionVo.builder().field("field2").build());
        table2.setExpression(expression2);
        tables.add(table2);

        SelectVo table3 = new SelectVo();
        table3.setAlias(" table3");
        table3.setTable(" ra_break");
        List<ExpressionVo> expression3 = Lists.newArrayList();
        expression3.add(ExpressionVo.builder().field("field3").build());
        table3.setExpression(expression3);
        tables.add(table3);

        List<JoinTableVo> joinTable = Lists.newArrayList();
        JoinTableVo joinTableVo1 = new JoinTableVo();
        joinTableVo1.setConnect(" inner join ");
        joinTableVo1.setPreAlias("table1");
        joinTableVo1.setPreField("sgbh");
        joinTableVo1.setNextAlias("table2");
        joinTableVo1.setNextField("xm");
        joinTable.add(joinTableVo1);

        JoinTableVo joinTableVo2 = new JoinTableVo();
        joinTableVo2.setConnect(" inner join ");
        joinTableVo2.setPreAlias("table2");
        joinTableVo2.setPreField("xm");
        joinTableVo2.setNextAlias("table3");
        joinTableVo2.setNextField("wfdz");
        joinTable.add(joinTableVo2);

        JoinTableVo joinTableVo3 = new JoinTableVo();
        joinTableVo3.setConnect(" inner join ");
        joinTableVo3.setPreAlias("table3");
        joinTableVo3.setPreField("xm");
        joinTableVo3.setNextAlias("table4");
        joinTableVo3.setNextField("wfdz");
        joinTable.add(joinTableVo3);
        log.info(JSONObject.toJSONString(joinTable));

        Map<String,JoinTableVo> joinTableMap= Maps.newLinkedHashMap();
        joinTable.forEach(joinTableVo -> {

        });



        Map<String, SelectVo> tableVoMap = Maps.newHashMap();
        tables.forEach(tableVo -> {
            tableVoMap.put(tableVo.getAlias().trim(), tableVo);
        });

        //是否已经被关联过的表了
        Map<String, SelectVo> existsJoinTableMap = Maps.newHashMap();

        StringBuilder joinSb = new StringBuilder();
        StringBuilder whereSb = new StringBuilder();

        for (JoinTableVo joinTableVo : joinTable) {
            SelectVo preAlias = tableVoMap.get(joinTableVo.getPreAlias());
            SelectVo nextAlias = tableVoMap.get(joinTableVo.getNextAlias());

            //初始化第一次
            if (existsJoinTableMap.size() == 0) {
                existsJoinTableMap.put(preAlias.getAlias().trim(), preAlias);
                existsJoinTableMap.put(nextAlias.getAlias().trim(), nextAlias);

                //SELECT * FROM ra_acd_file acd
                //INNER JOIN ra_break br ON acd.ra_id=br.wyid
                //INNER JOIN ra_break br ON acd.ra_id=br.wyid
                joinSb.append(" from ").append(preAlias.getTable()).append(preAlias.getAlias())
                        .append(joinTableVo.getConnect())
                        .append(nextAlias.getTable()).append(nextAlias.getAlias()).append(" on ")
                        .append(preAlias.getAlias()).append(".").append(joinTableVo.getPreField())
                        .append(joinTableVo.getExpression())
                        .append(nextAlias.getAlias()).append(".").append(joinTableVo.getNextField());

            } else {
                joinSb.append(joinTableVo.getConnect())
                        .append(nextAlias.getTable()).append(nextAlias.getAlias()).append(" on ")
                        .append(preAlias.getAlias()).append(".").append(joinTableVo.getPreField())
                        .append(joinTableVo.getExpression())
                        .append(nextAlias.getAlias()).append(".").append(joinTableVo.getNextField());


                existsJoinTableMap.put(preAlias.getAlias(), preAlias);
                existsJoinTableMap.put(nextAlias.getAlias(), nextAlias);
            }

        }
        joinSb.insert(0,"select * ");
        log.info(joinSb.toString());
    }
}
